#include <iostream>
#include <future>
#include <memory>
#include <thread>

int Add(int x, int y)
{
    return x + y;
}


int main()
{
    // 1. 封装 Add
    // std::packaged_task<int(int, int)> task(Add);
    std::shared_ptr<std::packaged_task<int(int, int)>> task = std::make_shared<std::packaged_task<int(int, int)>>(Add);

    // 2. 获取 task 相关的 future
    std::future<int> res = task->get_future();

    // 3. 执行
    std::thread t([&task](){ // 传引用捕捉
        (*task)(10, 20);
    });


    // 4. 获取结果
    std::cout << res.get() << std::endl;

    t.join(); // join 

    return 0;
}